#pragma once

#include "noncopyable.h"
#include"EventLoopThread.h"
#include"EventLoop.h"

#include <functional>
#include<string>
#include<memory>
#include<vector>

class EventLoop;
class EventLoopThread;

class EventLoopThreadPool : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop *)>;

    EventLoopThreadPool(EventLoop* baseLoop, const std::string &nameArg);
    ~EventLoopThreadPool();

    void setThreadNum(int numThreads) {numThreads_ = numThreads;}

    void start(const ThreadInitCallback &cb = ThreadInitCallback());

    //如果在多线程，baseloop以轮询方式分类channel给subloop
    EventLoop* getNextLoop();

    std::vector<EventLoop*> getAllLoops();

    bool started() const {return started_;}
    const std::string name() const {return name_;}
private:
    EventLoop* baseLoop_; //用户的baseloop EventLoop loop;
    std::string name_;
    bool started_;
    int numThreads_;
    int next_;
    std::vector<std::unique_ptr<EventLoopThread>> threads_; //所有的EventLoopThread
    std::vector<EventLoop*> loops_; //所有的EventLoop
};
